package com.example.demo1.service;

import com.example.demo1.common.WrapMapper;
import com.example.demo1.common.Wrapper;
import com.example.demo1.entity.Course;
import com.example.demo1.entity.User;
import com.example.demo1.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalTime;
import java.util.List;

@Service
public class UserService {
    @Autowired
    public UserMapper userMapper;

    //1、注册
    public Wrapper register(User user) {
        // (1) 查询用户是否存在
        User existingUser = userMapper.selectStuName(user.getStuName());
        if (existingUser != null){
            return WrapMapper.error("用户已存在！");
        }
        // (2) 插入用户数据
        int rows = userMapper.insertUser(user);
        if (rows > 0){
            return WrapMapper.ok(user);
        }else {
            return WrapMapper.error("注册失败！");
        }
    }

    //2、登录
    public Wrapper login(String stuName, String stuId) {
        // (1) 根据用户名查询用户是否存在
        User user = userMapper.getUserName(stuName);
        if (user == null) {
            return WrapMapper.error("用户名不存在");
        }
        // (2) 验证密码是否正确
        if (!user.getStuId().equals(stuId)) {
            return WrapMapper.error("密码错误");
        }
        return WrapMapper.ok(user);
    }


    //3、查询所有用户信息
    public List<User> getAllUser(){
        List<User> userList = userMapper.getAllUser();
        return userList;
    }

    //4、修改用户信息
    // (1) 查询用户是否存在
    public Wrapper updateUser(User user) {
        User existingUser = userMapper.selectUserById(user.getStuId());
        if (existingUser == null) {
            return WrapMapper.error("用户不存在");
        }
        // (2) 验证用户修改的信息是否和数据库一样
        if (existingUser.getStuName().equals(user.getStuName()) &&
                existingUser.getPhone().equals(user.getPhone()) &&
                existingUser.getSex().equals(user.getSex()) &&
                existingUser.getAge().equals(user.getAge()) &&
                existingUser.getMajor().equals(user.getMajor())) {
            return WrapMapper.error("修改内容和原来一样");
        }
        // (3) 判断用户名是否存在
        if (!existingUser.getStuName().equals(user.getStuName()) && userMapper.selectUserByName(user.getStuName()) != null) {
            return WrapMapper.error("用户名已被占用");
        }
        int result = userMapper.updateUser(user);
        if (result > 0) {
            return WrapMapper.ok("更新成功");
        } else {
            return WrapMapper.error("更新失败");
        }
    }

    //5、删除用户
    public Wrapper deleteUser(String stuId) {
        User user = userMapper.selectUserById(stuId);
        if (user == null) {
            return WrapMapper.error("用户不存在");
        }
        int result = userMapper.deleteUser(stuId);
        if (result > 0) {
            return WrapMapper.ok("删除成功！");
        } else {
            return WrapMapper.error("删除失败");
        }
    }


    //6、根据用户id查询当前可选课程
    public Wrapper getAllCourses(String stuId) {
        User user = userMapper.getUserById(stuId);
        // (1) 先查询该用户是否存在数据表中
        if (user == null) {
            return WrapMapper.error("用户不存在,请重新登录！");
        }
        // (2) 验证课程表不能为空
        List<Course> courses = userMapper.getAllCourses(stuId);
        if (courses.isEmpty()) {
            return WrapMapper.error("当前没有可选课程");
        }
        return WrapMapper.ok(courses);
    }

    //7、根据课程id查询课程信息
    public Wrapper getCourseInfo(String stuId, String courseId) {
        User user = userMapper.getUserById(stuId);
        // (1) 验证用户是否存在
        if (user == null) {
            return WrapMapper.error("用户不存在，请重新登录");
        }
        // (2) 验证课程是否存在
        Course course = userMapper.getCourseById(courseId);
        if (course == null) {
            return WrapMapper.error("课程不存在");
        }
        return WrapMapper.ok(course);
    }


    //8、根据用户id查询已选课程
    public Wrapper enrollCourse(String stuId, String courseId) {
        int userCount = userMapper.countUser(stuId);
        if (userCount == 0) {
            return WrapMapper.error("用户不存在");
        }

        int courseCount = userMapper.countCourse(courseId);
        if (courseCount == 0) {
            return WrapMapper.error("课程不存在");
        }

        Course course = userMapper.selectCourse(courseId);
        if (course == null || course.getCurrentStudents() >= course.getMaxStudents()) {
            return WrapMapper.error("课程人数已满");
        }

        int enrollmentCount = userMapper.countEnrollment(stuId, courseId);
        if (enrollmentCount > 0) {
            return WrapMapper.error("用户已选该课程");
        }

        int rows = userMapper.insertEnrollment(stuId, courseId);
        if (rows > 0) {
            int updatedRows = userMapper.updateCourseCurrentStudents(courseId);
            if (updatedRows > 0) {
                return WrapMapper.ok(course);
            } else {
                return WrapMapper.error("更新课程信息失败");
            }
        } else {
            return WrapMapper.error("选课失败");
        }
    }

    //9、用户进行选课（修改选课信息）
    public Wrapper EnrolledCourses(String stuId) {
        User user = userMapper.findUserById(stuId);
        // (1) 用户是否存在
        if (user == null) {
            return WrapMapper.error("用户不存在");
        }
        // (2) 用户是否选过课程
        List<Course> courses = userMapper.findCoursesByUserId(stuId);
        if (courses.isEmpty()) {
            return WrapMapper.error("用户未选任何课程");
        }
        return WrapMapper.ok(courses);
    }

    //10、用户退课（删除选课）
    public String dropCourse(String stuId, String courseId) {
        // (1) 检查用户是否存在
        User user = userMapper.findUserByStuId(stuId);
        if (user == null) {
            return "用户不存在";
        }

        // (2) 检查课程是否存在
        Course course = userMapper.findCourseById(courseId);
        if (course == null) {
            return "课程不存在";
        }

        // (3) 检查学生是否选择了该课程
        int enrollmentCount = userMapper.countEnrollment(stuId, courseId);
        if (enrollmentCount == 0) {
            return "用户没有选择这门课";
        }

        // (4) 执行退课操作
        int result = userMapper.deleteCourses(stuId, courseId);
        if (result > 0) {
            // (5) 更新课程当前学生数
            userMapper.updateCourseCurrentStudents(courseId);
            return "退课成功";
        } else {
            return "退课失败";
        }
    }
}
